iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

Codewar 進進出出 JS/Ruby系列 第 19

左邊等於右邊

  • 分享至 

  • xImage
  •  

題目:
(7 級) Peak array index
你會得到一個整數陣列,請回傳 index,使該 index 右側的元素總和等於 index 左側的元素總和。
如果沒有則回傳 -1
如果有多個這樣的 index,則回傳最左邊的 index

範例:

peak([1,2,3,5,3,2,1])  = 3
因為 index 為 0, 1, 2 的總和等於 index 為 4, 5, 6 的總和

peak([1,12,3,3,6,3,1]) = 2

peak([10,20,30,40])    = -1

Ruby 解法:

def peak(arr)
  # 把 arr 中的每個 element 和 index 拿出來比對
  arr.each_with_index {|num, index|
    # 如果左邊的總和等於右邊的總和
    if arr[0..index].sum == arr[index..-1].sum
      # 回傳該 index
      return index
    end
  }
	
  # 如果都沒有找到符合條件的 index 則回傳 -1
  return -1
end

JavaScript 解法:

function peak(arr){
  // 先將變數 left, right, first 都設定為 0
  // left 代表陣列左邊總和
  let left = 0;
  // right 代表陣列右邊總和
  let right = 0;
  // first 代表由左邊開始的 index
  let first = 0;
  // 變數 last 為由右邊開始的 index
  let last = arr.length - 1;
  
  // 開始比對 first 和 last 分別代表的 index
  while (first < last) {
	
    // 如果陣列左邊的總和大於右邊總和
    if (left > right){
      // 就讓 right 加上右邊的數字
      right += arr[last];
      // 同時 last 往左移
      last--;
    } else if (left <= right){
      // 反之則讓 left 加上左邊的數字
      left += arr[first];
      // 同時 first 往右移
      first++;
    }
  }
	
  // 最後檢查 last 和 first 所在的 index 是否一樣
  // 以及左邊總和 和 右邊總和是否一樣
  return last == first && left == right ? last : -1;
}

上一篇
有記憶的斐波那契
下一篇
薛丁格的布林值
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言